import java.util.PriorityQueue;
import java.util.Queue;

public class MyCycleQueue {
    public int elem[];

    //int usedSize;
    public int front;//队首
    public int rear;//队尾
    public Boolean tmp = false;
    public MyCycleQueue(int k) {
        elem = new int[k+1];//空一个
    }
    //向循环队列插入一个元素
    public boolean enQueue(int value) {
        if(isFull()) {
            return false;
        }
        elem[rear] = value;
        rear = (rear + 1)%elem.length;
        //usedSize++;
        tmp = true;
        return true;
    }
    //从循环队列中删除一个元素
    public boolean deQueue() {
        if(isEmpty()) {
            return false;
        }
        elem[front] = 0;
        front = (front + 1)%elem.length;
        //usedSize--;
        tmp = false;
        return true;
    }
    //从队首获取元素
    public int Front() {
        if(isEmpty()) {
            return -1;
        }
        return elem[front];
    }
    //获取队尾元素
    public int Rear() {
        if(isEmpty()) {
            return -1;
        }
        int index = (rear == 0) ? elem.length-1 : (rear -1);
        return elem[index];
    }
//    如何区分空与满
//1. 通过添加 size 属性记录
//2. 保留一个位置
//3. 使用标记
    public boolean isEmpty() {
        //1. 通过添加 size 属性记录return usedSize == 0;
        //2. 保留一个位置
        //return front == rear;
        //3. 使用标记
        return (!tmp && front == rear);
    }

    public boolean isFull() {
        //1. 通过添加 size 属性记录return usedSize == elem.length;
        //2. 保留一个位置
        //return front == (rear + 1)%elem.length;
        //3. 使用标记
        return (tmp && front == rear);
    }
}
